// 文生图云函数入口文件
const cloud = require('wx-server-sdk');
const axios = require('axios');

cloud.init({
  env: cloud.DYNAMIC_CURRENT_ENV
});

const db = cloud.database();
const imageCollection = db.collection('images');

// 阿里云百炼API基础配置
const BASE_URL = 'https://dashscope.aliyuncs.com/api/v1';
const MODEL = 'wanx2.1-t2i-plus';

// 确保数据库集合存在
async function ensureCollectionExists(collectionName) {
  try {
    // 检查集合是否存在
    const collections = await db.collections();
    const collectionNames = collections.data.map(col => col.name);
    
    if (!collectionNames.includes(collectionName)) {
      console.log(`集合 ${collectionName} 不存在，正在创建...`);
      await db.createCollection(collectionName);
      console.log(`集合 ${collectionName} 创建成功`);
    } else {
      console.log(`集合 ${collectionName} 已存在`);
    }
    return true;
  } catch (error) {
    console.error(`确保集合 ${collectionName} 存在时出错:`, error);
    return false;
  }
}

// 云函数入口函数
exports.main = async (event, context) => {
  const { action, data } = event;
  const wxContext = cloud.getWXContext();
  const openId = wxContext.OPENID;
  
  console.log('文生图云函数调用', { action, data, openId });
  
  // 确保必要的集合存在
  await ensureCollectionExists('imageTasks');
  await ensureCollectionExists('images');
  
  // 获取API Key
  const apiKey = process.env.DASHSCOPE_API_KEY;
  if (!apiKey) {
    console.error('未配置DASHSCOPE_API_KEY环境变量');
    return {
      success: false,
      message: '未配置 DASHSCOPE_API_KEY 环境变量'
    };
  }
  
  try {
    // 根据不同的action执行不同的操作
    switch (action) {
      case 'createImageTask':
        return await createImageTask(data, apiKey, openId);
      case 'getTaskResult':
        return await getTaskResult(data, apiKey);
      default:
        console.error('未知的操作类型', action);
        return {
          success: false,
          message: '未知的操作类型'
        };
    }
  } catch (err) {
    console.error('文生图操作失败', err);
    return {
      success: false,
      message: err.message || '操作失败',
      error: err.toString()
    };
  }
};

/**
 * 创建图像生成任务
 * @param {Object} data 包含prompt等参数
 * @param {String} apiKey API密钥
 * @param {String} openId 用户openId
 */
async function createImageTask(data, apiKey, openId) {
  const { prompt, negativePrompt, size = "1024*1024", n = 1 } = data;
  
  console.log('创建图像任务', { prompt, negativePrompt, size, n });
  
  if (!prompt) {
    return {
      success: false,
      message: '提示词不能为空'
    };
  }
  
  try {
    console.log('调用阿里云API创建任务开始');
    
    // 调用阿里云API创建任务
    const response = await axios({
      method: 'post',
      url: `${BASE_URL}/services/aigc/text2image/image-synthesis`,
      headers: {
        'Authorization': `Bearer ${apiKey}`,
        'Content-Type': 'application/json',
        'X-DashScope-Async': 'enable'
      },
      data: {
        model: MODEL,
        input: {
          prompt: prompt,
          negative_prompt: negativePrompt
        },
        parameters: {
          size: size,
          n: n,
          prompt_extend: true,
          watermark: false
        }
      }
    });
    
    console.log('阿里云API响应', response.data);
    
    // 如果请求成功
    if (response.data && response.data.output && response.data.output.task_id) {
      const taskId = response.data.output.task_id;
      const taskStatus = response.data.output.task_status;
      
      console.log('任务创建成功', { taskId, taskStatus });
      
      try {
        // 在数据库中创建任务记录
        const addResult = await db.collection('imageTasks').add({
          data: {
            taskId,
            prompt,
            negativePrompt,
            size,
            n,
            status: taskStatus,
            openId,
            createdAt: db.serverDate(),
            updatedAt: db.serverDate()
          }
        });
        
        console.log('数据库记录添加成功', addResult);
      } catch (dbErr) {
        console.error('数据库操作失败', dbErr);
        // 数据库操作失败不影响主流程，继续返回任务ID
      }
      
      return {
        success: true,
        taskId,
        status: taskStatus
      };
    } else {
      console.error('创建任务失败，返回数据异常', response.data);
      return {
        success: false,
        message: '创建任务失败',
        data: response.data
      };
    }
  } catch (error) {
    console.error('创建图像任务失败', error);
    
    // 尝试提取更详细的错误信息
    let errorMessage = error.message || '创建任务失败';
    let errorData = null;
    
    if (error.response) {
      errorMessage = error.response.data?.message || errorMessage;
      errorData = error.response.data;
      console.error('API响应错误', {
        status: error.response.status,
        data: error.response.data
      });
    }
    
    return {
      success: false,
      message: errorMessage,
      error: errorData || error.toString()
    };
  }
}

/**
 * 获取任务结果
 * @param {Object} data 包含taskId参数
 * @param {String} apiKey API密钥
 */
async function getTaskResult(data, apiKey) {
  const { taskId } = data;
  
  if (!taskId) {
    return {
      success: false,
      message: '任务ID不能为空'
    };
  }
  
  try {
    // 调用阿里云API获取任务结果
    const response = await axios({
      method: 'get',
      url: `${BASE_URL}/tasks/${taskId}`,
      headers: {
        'Authorization': `Bearer ${apiKey}`,
      }
    });
    
    console.log('获取任务状态API响应', response.data);
    
    let taskRecord = null;
    
    try {
      // 获取任务详情
      const taskDetail = await db.collection('imageTasks').where({ taskId }).get();
      taskRecord = taskDetail.data[0];
    } catch (dbErr) {
      console.error('查询任务详情失败', dbErr);
      // 查询失败不影响主流程
    }
    
    // 如果任务成功完成，且有结果
    if (response.data && response.data.output && response.data.output.task_status === 'SUCCEEDED') {
      const results = response.data.output.results;
      const taskStatus = response.data.output.task_status;
      
      // 更新数据库中的任务状态
      if (taskRecord) {
        try {
          await db.collection('imageTasks').doc(taskRecord._id).update({
            data: {
              status: taskStatus,
              results: results,
              updatedAt: db.serverDate()
            }
          });
        } catch (updateErr) {
          console.error('更新任务状态失败', updateErr);
          // 更新失败不影响主流程
        }
      }
      
      return {
        success: true,
        status: taskStatus,
        results: results,
        prompt: taskRecord ? taskRecord.prompt : null
      };
    } 
    // 如果任务正在进行中
    else if (response.data && response.data.output) {
      const taskStatus = response.data.output.task_status;
      
      // 更新数据库中的任务状态
      if (taskRecord) {
        try {
          await db.collection('imageTasks').doc(taskRecord._id).update({
            data: {
              status: taskStatus,
              updatedAt: db.serverDate()
            }
          });
        } catch (updateErr) {
          console.error('更新任务状态失败', updateErr);
          // 更新失败不影响主流程
        }
      }
      
      return {
        success: true,
        status: taskStatus,
        prompt: taskRecord ? taskRecord.prompt : null
      };
    } else {
      return {
        success: false,
        message: '获取任务结果失败',
        data: response.data
      };
    }
  } catch (error) {
    console.error('获取任务结果失败', error);
    
    // 尝试提取更详细的错误信息
    let errorMessage = error.message || '获取任务结果失败';
    let errorData = null;
    
    if (error.response) {
      errorMessage = error.response.data?.message || errorMessage;
      errorData = error.response.data;
      console.error('API响应错误', {
        status: error.response.status,
        data: error.response.data
      });
    }
    
    return {
      success: false,
      message: errorMessage,
      error: errorData || error.toString()
    };
  }
} 